/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package CapaDatos;

import CapaSeguridad.CodigoErrorEnum;
import CapaSeguridad.GuateBayException;
import java.sql.ResultSet;
import java.util.LinkedList;
/**
 *
 * @author JRN
 */
public class Pedido_DAO implements DAO{

     private String sentenciaSQL;
    ConexionDB conexion;
    LinkedList<Pedido_POJO> listaDetalle = new LinkedList<Pedido_POJO>();
    ResultSet resultado;

    public Pedido_DAO() {

        conexion = new ConexionDB();
    }

     //Estructura Pedido
        //idPedido int PRIMARY KEY,
        //statusOrden varchar(45),
        //fechaIngreso timestamp,
        //descripcion varchar(100),
        //fechaPago timestamp,
        //statusPago boolean,
        //idUsuario int REFERENCES Usuario(idUsuario),
        //idShipping int REFERENCES Shipping(idShipping)

    /**
     * Retorna el pedido especificado
     * @param pIdPedido id del pedido que se desea
     * @return retorna un LinkedList< Pedido_Pojo >
     */
    public LinkedList<Pedido_POJO> obtenerReg(int id) {



        conexion.abrirConexion();

        sentenciaSQL = "SELECT * FROM Pedido WHERE idPedido=" + id;

        try {
            resultado = conexion.getResultSet(sentenciaSQL);

            if (resultado.next()) {
                Pedido_POJO objPedido = new Pedido_POJO();

                objPedido.setIdPedido(Integer.parseInt(resultado.getString("idPedido")));
                objPedido.setStatusOrden(resultado.getString("statusOrden"));
                objPedido.setFechaIngreso(resultado.getString("fechaIngreso"));
                objPedido.setDescripcion(resultado.getString("descripcion"));
                objPedido.setFechaPago(resultado.getString("fechaPago"));
                objPedido.setStatusPago(Boolean.parseBoolean(resultado.getString("statusPago")));
                objPedido.setIdUsuario(Integer.parseInt(resultado.getString("idUsuario")));
                objPedido.setIdShipping(Integer.parseInt(resultado.getString("idShipping")));

                listaDetalle.add(objPedido);


            }

        } catch (Exception ex) {
            System.out.println("error " + ex);
            conexion.cerrarConexion();
            return null;
        }
        conexion.cerrarConexion();
        return listaDetalle;
    }

    /**
     * Retorna todos los pedidos de un usuario
     * @param idUsuario id del usuario el cual se quiere obtener sus pedidos
     * @return retorna un LinkedList< Pedido_Pojo >
     */
    public LinkedList<Pedido_POJO> obtenerPedidosUsuario(int idUsuario) {
    conexion.abrirConexion();
        sentenciaSQL = "SELECT * FROM Pedido WHERE idUsuario=" + idUsuario;

        try {
            resultado = conexion.getResultSet(sentenciaSQL);

            if (resultado.next()) {
                Pedido_POJO objPedido = new Pedido_POJO();

                objPedido.setIdPedido(Integer.parseInt(resultado.getString("idPedido")));
                objPedido.setStatusOrden(resultado.getString("statusOrden"));
                objPedido.setFechaIngreso(resultado.getString("fechaIngreso"));
                objPedido.setDescripcion(resultado.getString("descripcion"));
                objPedido.setFechaPago(resultado.getString("fechaPago"));
                objPedido.setStatusPago(Boolean.parseBoolean(resultado.getString("statusPago")));
                objPedido.setIdUsuario(Integer.parseInt(resultado.getString("idUsuario")));
                objPedido.setIdShipping(Integer.parseInt(resultado.getString("idShipping")));

                listaDetalle.add(objPedido);


            }

        } catch (Exception ex) {
            System.out.println("error " + ex);
            conexion.cerrarConexion();
            return null;
        }
        conexion.cerrarConexion();
        return listaDetalle;
    }




    public int guardarReg(String statusOrden, String fechaIngreso, String descripcion, String fechaPago, boolean statusPago, int idUsuario, int idShipping) throws GuateBayException {

    conexion.abrirConexion();
        sentenciaSQL = "INSERT INTO Pedido(statusOrden,fechaIngreso,descripcion,fechaPago,statusPago,idUsuario,idShipping) VALUES ('"
                          + statusOrden + "','" + fechaIngreso + "','" + descripcion + "','"+fechaPago+"',"+statusPago+","+idUsuario+","+idShipping+") RETURNING idPedido";

        try {
            ResultSet ret =  conexion.getResultSet(sentenciaSQL);
            conexion.cerrarConexion();
            ret.next();
            return ret.getInt("idPedido");


        } catch (Exception ex) {
            System.out.println("error " + ex);
            conexion.cerrarConexion();
            throw new GuateBayException(ex,"Error en transacción",CodigoErrorEnum.ErrorRegion);            
        }

    }


    
    public int actualizarReg(int idPedido, String statusOrden, String fechaIngreso, String descripcion, String fechaPago, boolean statusPago, int idUsuario, int idShipping) {
    conexion.abrirConexion();
        sentenciaSQL = "UPDATE Pedido SET "
                    + "statusOrden = '"+statusOrden+"',"
                    + "fechaIngreso = '"+fechaIngreso+"',"
                    + "descripcion = '"+descripcion+"',"
                    + "fechaPago = '"+fechaPago+"',"
                    + "statusPago = "+statusPago+","
                    + "idUsuario = "+idUsuario+","
                    + "idShipping = "+idShipping
                    + "  WHERE idPedido = " + idPedido;


        try {
            int ret = conexion.executeQuery(sentenciaSQL);
            conexion.cerrarConexion();
            return ret;

        } catch (Exception ex) {
            System.out.println("error " + ex);
            conexion.cerrarConexion();
            return -1;
        }
    }






     public int eliminarReg (int id){
     conexion.abrirConexion();
        sentenciaSQL = "DELETE FROM Pedido WHERE idPedido="+id;

        try {
            int ret = conexion.executeQuery(sentenciaSQL);
            conexion.cerrarConexion();
            return ret;

        } catch (Exception ex) {
            conexion.cerrarConexion();
            System.out.println("error " + ex);
            return -1;
        }

    }




      /**
     * Retorna todos los pedidos con su detalle de articulos de un usuario
     * @param idUsuario id del usuario el cual se quiere obtener sus pedidos
     * @return retorna un ResultSet con los campos statusOrden, fechaIngreso, descripcion, fechaPago,
       * statusPago, cantidad, descuento , Articulo"
     */
    public ResultSet obtenerPedidoDetalleUsuario(int idUsuario) {
    conexion.abrirConexion();
        sentenciaSQL = "SELECT p.statusOrden,p.fechaIngreso, p.descripcion, p.fechaPago, p.statusPago, d.cantidad, d.descuento , a.nombre AS Articulo"
                + " FROM Pedido p, Detalle d, Articulo a "
                + " WHERE p.idPedido = d.Pedido_idPedido "
                + " AND d.Articulo_idArticulo = a.idArticulo "
                + " AND p.Usuario_idUsuario = "+idUsuario;

        try {

            resultado = conexion.getResultSet(sentenciaSQL);

        } catch (Exception ex) {
            System.out.println("error " + ex);
            conexion.cerrarConexion();
            return null;
        }
        conexion.cerrarConexion();
        return resultado;
    }





}
